package org.qiyu.live.user.provider.dao.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.qiyu.live.user.provider.dao.po.UserTagPO;

/**
 * @Author idea
 * @Date: Created in 17:13 2023/5/27
 * @Description
 */
@Mapper
public interface IUserTagMapper extends BaseMapper<UserTagPO> {

    /**
     * 使用或的思路来设置标签，只能允许第一次设置成功
     *
     *
     * sql的思路 将原先的标签内容和传入的tag标签 进行或操作（或操作逻辑上会把新的标签内容加入源标签）
     *          update触发条件是  userid、 并且源标签与传入的标签进行与操作（如果与操作结果为0，说明没有该标签，可以设置）
     *
     *          传入的tag  0 0 0 0 0 1 0   类似这样的，只会出现一个 1  ,如果与运算结果为1，说明该标签已经存在，设置失败
     *
     * @param userId
     * @param fieldName
     * @param tag
     * @return
     */
    @Update("update t_user_tag set ${fieldName}=${fieldName} | #{tag} where user_id=#{userId} and ${fieldName} & #{tag}=0")
    int setTag(Long userId, String fieldName, long tag);           //tag只会出现一个 1  ,如果与运算结果为1，说明该标签已经存在

    /**
     * 使用先取反在与的思路来取消标签，只能允许第一次删除成功
     *
     * @param userId
     * @param fieldName
     * @param tag
     * @return
     */
    @Update("update t_user_tag set ${fieldName}=${fieldName} &~ #{tag} where user_id=#{userId} and ${fieldName} & #{tag}=#{tag}")
    int cancelTag(Long userId, String fieldName, long tag);

    /**
     * 判断用户是否拥有该标签
     * @param userId
     * @param fieldName
     * @param tag
     * @return
     */
    @Select("select count(1) from t_user_tag where user_id=#{userId} and ( ${fieldName} & #{tag} ) = #{tag}")
    int containTag(Long userId, String fieldName, long tag);

}
